package com.itheima.reggie.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.reggie.dto.DishDto;
import com.itheima.reggie.entity.Category;
import com.itheima.reggie.entity.Dish;
import com.itheima.reggie.entity.DishFlavor;
import com.itheima.reggie.mapper.CategoryMapper;
import com.itheima.reggie.mapper.DishMapper;
import com.itheima.reggie.service.CategoryService;
import com.itheima.reggie.service.DishFlavorService;
import com.itheima.reggie.service.DishService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @author ：石破天
 * @date ：Created in 2022年11月16日
 * @description ：
 * @version: 1.0
 */
@Service
@Slf4j
public class DishServiceImpl extends ServiceImpl<DishMapper, Dish> implements DishService {

    //这个因为 数据添加到 口味表 需要service来实现
    @Autowired
    private DishFlavorService dishFlavorService;


    /**
     *  新增 菜品的同时  在存入 菜品相关的口味信息
     * @param dishDto
     */
    @Override
    @Transactional
    public void saveDishAndFlavor(DishDto dishDto) {
        //1:保存菜品基本信息
       //添加没有做之前是不是还没有 菜品id呢
//        Dish dish = new Dish();
//        dish.setName(dishDto.getName());
        //.....
        // 完全没有必要  Dish是爹   DishDto是儿子
        // d爹是不是 可以接收儿子
        save(dishDto);// 存到 dish表里面数据了
        // save(Dish ) 可以传 Dish的儿子
        // 保存完了 是不是就有id了?  内置了主键id回显
        Long dishId = dishDto.getId();
        log.info("查看添加菜品之后,菜品的id:"+dishId);
        //2:保存 菜品口味信息
        // 问菜品口味信息在哪?
        List<DishFlavor> flavors = dishDto.getFlavors();
        // 有多个口味信息
        // 一个口味必定属于 一个菜品
        // 遍历给每个口味 添加上它所属的菜品id信息
        //  这些口味信息 是不是属于 刚刚生成的 菜品的口味
        for (DishFlavor flavor : flavors) {
            flavor.setDishId(dishId);//关联了一下
        }
        // 进行添加  批量添加
        dishFlavorService.saveBatch(flavors);

        System.out.println("完成添加...");
    }

    @Override
    public DishDto getByIdWithFlavor(Long id) {
        DishDto dishDto = new DishDto();
         // 根据菜品id查询相关的 菜品信息  封装到 返回的dishDto中
         // 怎么根据id查菜品信息呀?
        //  操作哪张表 找那张表的 Service
        //  dishService  本身在dishService 不用对象名 直接调用
        Dish dish = getById(id);  // 去本类中找该方法  没有就去父类中找
                    //  this.getById(id);// 去本类中找该方法  没有就去父类中找
                  //  super.getById(id);// 直接去父类中找...不看本类中有没有
        // dish 属性怎么给到 dishDto中
        BeanUtils.copyProperties(dish,dishDto);

        // 根据菜品id 查询  相关的口味信息  封装到 dishDto的 flavors集合中
        //      用那张表  口味表  dishFlavorService口味信息
        // dishFlavorService.getById("主键id"); 不能用? 因为 根据菜品id
        // select  *  from dishFlavor where dish_id = ?
        // 构建条件 构造器
        LambdaQueryWrapper<DishFlavor> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(DishFlavor::getDishId,id);//where dish_id = ?
        // 查询
        List<DishFlavor> dishFlavors = dishFlavorService.list(wrapper);//根据条件查询多条记录
         //设置到 dishDto中
        dishDto.setFlavors(dishFlavors);

        return dishDto;
    }

    /**
     * 根据 菜品id 更新菜品表 和口味表
     * @param dishDto
     */
    @Override
    @Transactional
    public void updateWithFlavor(DishDto dishDto) {
        // 更新菜品表的语句  update dish set.... where id = ?
        // 这个语句对应的方法
        // 更新菜品
        updateById(dishDto);//要的 Dish 可以传dishDto

        // 更新口味
        // 1:把这个 菜品id 相关的 口味全部删除
        Long dishId = dishDto.getId();
        // delete from dish_flavor where dish_id = dishId
        LambdaQueryWrapper<DishFlavor> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(DishFlavor::getDishId,dishId);
        dishFlavorService.remove(wrapper);
        // 再添加
        //新的口味信息
        List<DishFlavor> flavors = dishDto.getFlavors();
        // 有多个口味信息
        // 一个口味必定属于 一个菜品
        // 遍历给每个口味 添加上它所属的菜品id信息
        //  这些口味信息 是不是属于 刚刚更新的 菜品的口味
        for (DishFlavor flavor : flavors) {
            flavor.setDishId(dishId);//关联了一下
        }
        // 进行添加  批量添加
        dishFlavorService.saveBatch(flavors);

    }
}
